package fr.auzaiphe.commun;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JTextField;

import fr.auzaiphe.commun.constantes.ConstantesFileChooser;

/**
 *
 * @author Hugp
 * Classe des fenetres de selection de chemins fichiers.i
 */
public class PopUpFilePath
{
	/**
	 * Pour passer le mode ddu selecteur de fichier en
	 * mode enregistrer sous
	 */
	public static final int SAVE_AS = 0;

	/**
	 * Pour passer le mode du selecteur de fichier en
	 * mode charger fichier scenario
	 */
	public static final int LOAD_FILE = 1;

	/**
	 * Pour passer le mode du selecteur de fichier en
	 * mode charger un fichier de contenu ( Ex : .jpg, .pdf, ... )
	 */
	public static final int LOAD_CONTENT = 2;


	private Controller controller;
	private JFileChooser fileChooser;
	private JDialog dialog;
	//private String directory; Pas sur que ce soit utile
	//private String fileName; Pas sur que ce soit utile
	private String filePath;
	
	private JTextField target;

	/**
	 * Fonction retournant le chemin de fichier indiqué par l'utilisateur
	 * @param pController Controlleur appellant la fonction (this la plupart du temps)
	 * @param pCallBack Mode du selecteur de fichier
	 * 		- utiliser les constantes
	 */
	public PopUpFilePath(Controller pController, int pCallBack)
	{
		this.controller = pController;

		this.dialog = new JDialog();

		// Ouverture du JFileChooser sur le répertoire de base du client
		this.fileChooser = new JFileChooser();


		switch ( pCallBack )
		{
			case SAVE_AS :
				this.initSave();
				break;
			case LOAD_FILE :
				this.initLoadFile();
				break;
			case LOAD_CONTENT :
				this.initLoadContent();
				break;
			default :
				System.err.println("PopUpFilePath : Error when loading JFileChooser");
		}

		this.dialog.add( this.fileChooser );
		this.dialog.pack();
		this.dialog.setVisible( true );
	}
	
	
	public PopUpFilePath(JTextField pTargetedField)
	{
		this.target = pTargetedField;

		this.dialog = new JDialog();

		// Ouverture du JFileChooser sur le répertoire de base du client
		this.fileChooser = new JFileChooser();

		this.initLoadContent();

		this.dialog.add( this.fileChooser );
		this.dialog.pack();
		this.dialog.setVisible( true );
	}


	/**
	 * Initilaise le JFileChooser en mode ouverture de fichier de contenu
	 */
	private void initLoadContent()
	{
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.AVI_EXTENSION);
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.JPG_EXTENSION);
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.PDF_EXTENTION);
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.WMA_EXTENSION);
		this.fileChooser.setAcceptAllFileFilterUsed(false);

		//this.fileChooser.setDialogType( JFileChooser.SAVE_DIALOG );
		this.fileChooser.addActionListener( this.createActionListener( LOAD_CONTENT ) );
	}


	/**
	 * Initialise le JFileChooser en mode ouverture de fichier .murder
	 */
	private void initLoadFile()
	{
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.MURDER_PARTY_EXTENTION);
		this.fileChooser.setAcceptAllFileFilterUsed(false);

		//this.fileChooser.setDialogType( JFileChooser.SAVE_DIALOG );
		this.fileChooser.addActionListener( this.createActionListener( LOAD_FILE ) );
	}

	/**
	 * Initialise le JFileChooser en mode enregistrer-sous
	 */
	private void initSave()
	{
		this.fileChooser.addChoosableFileFilter(ConstantesFileChooser.MURDER_PARTY_EXTENTION);
		this.fileChooser.setAcceptAllFileFilterUsed(false);

		// Pour ouvrir la fenetre de sauvegarde et pas celle d'ouverture de fichier
		this.fileChooser.setDialogType( JFileChooser.SAVE_DIALOG );
		this.fileChooser.addActionListener( this.createActionListener( SAVE_AS ) );
	}


	/**
	 * Créer l'action listener utilisé pour la sauvegarde
	 * @param pMode int selection du mode de création de l'action listener
	 * @return ActionListener pré-configuré pour notre sauvegarde
	 */
	private ActionListener createActionListener( final int pMode )
	{
		ActionListener nActionListener = new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent actionEvent)
			{
				String command = actionEvent.getActionCommand();

				if ( command.equals(JFileChooser.APPROVE_SELECTION) )
				{
					File selectedFile = ((JFileChooser) actionEvent.getSource()).getSelectedFile();
					PopUpFilePath.this.filePath = selectedFile.getAbsolutePath();

					// Fonction appellée dans le controlleur, passe le chemin du fichier en paramètre.
					// Cette fonction se trouve dans la classe mère controlleur du commun.
					switch( pMode )
					{
						case SAVE_AS :
							PopUpFilePath.this.controller.saveAs( PopUpFilePath.this.filePath );
							break;
						case LOAD_FILE :
							PopUpFilePath.this.controller.loadFile( PopUpFilePath.this.filePath );
							break;
						case LOAD_CONTENT :
							PopUpFilePath.this.target.setText( PopUpFilePath.this.filePath );
							break;
						default :
							System.err.println("PopUpFilePath : Error when creating ActionListener");
					}

					// Fermeture de la fenetre
					PopUpFilePath.this.dialog.dispose();
				}
				else if ( command.equals( JFileChooser.CANCEL_SELECTION ) )
				{
					PopUpFilePath.this.filePath = "NULL";
					PopUpFilePath.this.dialog.dispose();
				}
			}
		};

		return nActionListener;
	}
}
